"""
ihrm 登录接口 测试脚本层
"""
from api.ihrmLoginApi import IhrmLoginApi
from common.assertTools import common_assert
import logging
import jsonschema


class TestIhrmLogin(object):
    """定义 ihrm 登录接口 测试类"""

    def setup_class(self):
        # 创建 ihrm实例
        self.ihrm_login = IhrmLoginApi()

    def test01_login_success(self):
        """登录成功"""
        # 准备请求体数据
        req_body = {"mobile": "13800000002", "password": "123456"}
        # 用实例，调用 login方法
        resp = self.ihrm_login.login(req_body)
        # print("登录成功：", resp.json())

        logging.info(f"登录成功：{resp.json()}")

        # 不能使用全量字段校验。
        assert 200 == resp.status_code

        # 准备 全量字段校验规则 ---- 只能应用于 json 格式的数据校验！
        schema = {
            "type": "object",
            "properties": {
                "success": {"const": True},
                "code": {"const": 10000},  # "type":"integer" 校验不完整。
                "message": {"pattern": "^操作成功"},
                "data": {"type": "string"}
            },
            "required": ["success", "code", "message", "data"]
        }
        # 待校验数据， 就是发送完登录接口返回的 响应体。 这个方法调用，就相当于断言。 失败才有错误显示
        jsonschema.validate(instance=resp.json(), schema=schema)

        # 断言
        # common_assert(resp, 200, True, 10000, "操作成功")
        # assert True is resp.json().get("success")
        # assert 10000 == resp.json().get("code")
        # assert "操作成功" in resp.json().get("message")

    def test02_mobile_not_register(self):
        """手机号未注册"""

        # 准备请求体数据
        req_body = {"mobile": "18943743281", "password": "123456"}
        # 用实例，调用 login方法
        resp = self.ihrm_login.login(req_body)
        print("手机号未注册：", resp.json())
        # 断言
        common_assert(resp, 200, False, 20001, "用户名或密码错误")

    def test03_pwd_err(self):
        """密码错误"""

        # 准备请求体数据
        req_body = {"mobile": "13800000002", "password": "123456890"}
        # 用实例，调用 login方法
        resp = self.ihrm_login.login(req_body)
        print("密码错误：", resp.json())

        # 断言
        common_assert(resp, 200, False, 20001, "用户名或密码错误")

    def test04_10_mobile(self):
        """10位手机号"""
        # 准备请求体数据
        req_body = {"mobile": "1380000000", "password": "123456"}
        # 用实例，调用 login方法
        resp = self.ihrm_login.login(req_body)
        print("10位手机号：", resp.json())

        # 断言
        common_assert(resp, 200, False, 20001, "用户名或密码错误")

    def test05_12_mobile(self):
        req_body = {"mobile": "138000000023", "password": "123456"}
        resp = self.ihrm_login.login(req_body)
        print("12位手机号：", resp.json())
        common_assert(resp, 200, False, 20001, "用户名或密码错误")

    def test06_none_mobile(self):
        req_body = {"mobile": None, "password": "123456"}
        resp = self.ihrm_login.login(req_body)
        print("手机号为空：", resp.json())
        common_assert(resp, 200, False, 20001, "用户名或密码错误")

    def test07_mobile_have_special_char(self):
        req_body = {"mobile": "138abc*#$02", "password": "123456"}
        resp = self.ihrm_login.login(req_body)
        print("手机号含有特殊字符：", resp.json())
        common_assert(resp, 200, False, 20001, "用户名或密码错误")

    def test08_1_password(self):
        req_body = {"mobile": "13800000002", "password": "1"}
        resp = self.ihrm_login.login(req_body)
        print("1位密码：", resp.json())
        common_assert(resp, 200, False, 20001, "用户名或密码错误")

    def test09_100_password(self):
        req_body = {"mobile": "13800000002",
                    "password": "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"}
        resp = self.ihrm_login.login(req_body)
        print("100位密码：", resp.json())
        common_assert(resp, 200, False, 20001, "用户名或密码错误")

    def test10_none_pwd(self):
        req_body = {"mobile": "13800000002", "password": None}
        resp = self.ihrm_login.login(req_body)
        print("密码为空：", resp.json())
        common_assert(resp, 200, False, 20001, "用户名或密码错误")

    def test11_pwd_have_special_char(self):
        req_body = {"mobile": "13800000002", "password": "ABC123"}
        resp = self.ihrm_login.login(req_body)
        print("密码有特殊字符：", resp.json())
        common_assert(resp, 200, False, 20001, "用户名或密码错误")

    def test12_more_params(self):
        req_body = {"mobile": "13800000002", "password": "123456", "abc": "123"}
        # 用实例，调用 login方法
        resp = self.ihrm_login.login(req_body)
        print("多参：", resp.json())
        # 断言
        common_assert(resp, 200, True, 10000, "操作成功")

    def test13_less_params(self):
        req_body = {"password": "123456"}
        resp = self.ihrm_login.login(req_body)
        print("少参：", resp.json())
        common_assert(resp, 200, False, 20001, "用户名或密码错误")

    def test14_no_params(self):
        """无参"""
        # 用实例，调用 login方法
        resp = self.ihrm_login.login(None)  # 无参 -- 没有请求体 -- None
        print("无参：", resp.json())
        common_assert(resp, 200, False, 99999, "抱歉，系统繁忙，请稍后重试！")

    def test15_error_params(self):
        req_body = {"mobile": "13800000002", "pwd": "123456"}
        resp = self.ihrm_login.login(req_body)
        print("错误参数：", resp.json())
        common_assert(resp, 200, False, 20001, "用户名或密码错误")
